#include "../libreria.h"
#include "../response_storage_image.h"
#include <signal.h>
int s;

void deregistra(int sig_receive)
{
	close(s);
}

int main(int argc, char * argv[])
{
	char msg [BUFFER_SIZE];
	char nome_servizio [BUFFER_SIZE];
	char nome_immagine [BUFFER_SIZE];
	char ip_service_register [BUFFER_SIZE];
	bool ok_trasmissione;
	int porta_service_register;
	int i;
	
	int r;
	host service_provider;
	
	signal(SIGINT,deregistra);

	i = 0;
	if (argc != 5)
	{
		printf("Errore numero parametri:\nUsage: ./client_store_image ip_service_register porta_service_register nome_servizio nome_immagine.jpg\n");
		exit(1);
	}

	strcpy( ip_service_register, argv[1] );
	porta_service_register = atoi(argv[2]);
	strcpy( nome_servizio, argv[3] );
	strcpy( nome_immagine, argv[4] );


	/////////// INIZIALIZZAZIONE SOCKET PER CONNESSIONE SERVICE REGISTER /////////////

	s = inizializza_client( ip_service_register, porta_service_register );

	////////// INVIO MESSAGGI PER CONTATTARE SERVICE REGISTER //////////////
	
	strcpy( msg, "2;\0" );
	if (send( s, msg, strlen(msg), 0 ) == -1)
		printf("Errore nell'invio del messaggio per contattare il Service Register non andato a buon fine \n");

	memset( msg, 0, BUFFER_SIZE );
	sprintf(msg, "%s#", nome_servizio);

	if (send( s, msg, strlen(msg), 0 ) == -1)
	{
		printf("Errore invio nome del servizio richiesto\n");
		exit(1);
	}

	/////////// RICEZIONE RISPOSTA DA SERVICE REGISTER ////////////////////
	
	memset( msg, 0, BUFFER_SIZE );
	r = recv( s, msg, BUFFER_SIZE,0 );
	if (r == -1)
	{
		printf("Errore ricezione risposta dal Service Register\n");
		exit(1);
	}
	if(msg[0] == '0')
	{ 
		printf("Errore, il servizio richiesto non è disponibile\n");
		exit(1);
	}
	
	decode_msg_from_service_register( msg, service_provider.ip, &service_provider.porta );

	close(s);
	
	////////////////  CHIUSA CONNESSIONE CON SERVICE REGISTER  //////////////////


	////////// INIZIALIZZAZIONE CONNESSIONE CON SERVICE PROVIDER ////////////////
	
	service_provider.s = inizializza_client( service_provider.ip, service_provider.porta );	

	printf("CONNESSO con il Service Provider %s:%d\n", service_provider.ip, service_provider.porta);

	////////// RICEZIONE IMMAGINE DAL SERVICE PROVIDER ///////////////

	memset( msg, 0, BUFFER_SIZE );
	
	Response_Storage_Image rsi(service_provider);
	
	rsi.code_request(nome_immagine);

	ok_trasmissione = rsi.decode_response();

	if( ok_trasmissione )
	{
		if(!rsi.send_image(nome_immagine))
			printf("Impossibile inviare immagine.\nErrore connessione col server provider.\n");
		else
			printf("Immagine %s inviata correttamente!\n",argv[4]);
	}
	else
		printf("Errore nella codifica della richiesta di memorizzazione\n\n");

	close(service_provider.s); 

}

